package Banco;



/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

/**
 *
 * @author Josue
 */
public class Banco {

    static List<Cliente> ArrayClientes = new ArrayList<Cliente>();
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        LinkedList<Cliente> Caja1= new LinkedList<Cliente>();
        LinkedList<Cliente> Caja2= new LinkedList<Cliente>(); 
        LinkedList<Cliente> Caja3= new LinkedList<Cliente>(); 
        LinkedList<Cliente> Caja4= new LinkedList<Cliente>(); 
        
        int ingreso;
        int[] nuevo = new int[4];
        do{
        menu();
        
        
        ingreso = (int)obtenerNumero("¿Que opcioon desea realizar?",true);
        switch(ingreso){
            case 1:
                   int cant = (int)obtenerNumero("¿Cuantos clientes desa ingresar?",true);
                   for (int i=0;i<cant;i++){
                Cliente cli = new Cliente();
                ArrayClientes.add(cli);
                cli.setEntrada((int)obtenerNumero("Ingrese el tiempo de entrada para Cliente "+(i+1),true));
                cli.setTransac();
                cli.setCaja(1);
                }
                for(int y=0;y<ArrayClientes.size();y++){
                    if (Caja1.size() + Caja2.size()+Caja3.size()+Caja4.size()==40)y=ArrayClientes.size()+1;
                    Cliente cli0 = ArrayClientes.get(y);
                    cli0.setEspera(calcTiemp(y));
                    cli0.setTot();
                    Cliente cli1 = null;
                    Cliente cli2 = null;
                    Cliente cli3 = null;
                    Cliente cli4 = null;
                    int menor = 0;
                    if(!Caja1.isEmpty()) cli1 = Caja1.peek();
                    if(!Caja2.isEmpty()) cli2 = Caja2.peek();
                    if(!Caja3.isEmpty()) cli3 = Caja1.peek();
                    if(!Caja4.isEmpty()) cli4 = Caja2.peek();
                    try{
                    if(cli0.getEntrada()>cli1.getTot()){ Caja1.poll(); cli0.setEstado(1);System.out.println("Salio un cliente c1.");}
                    if(cli0.getEntrada()>cli2.getTot()){ Caja2.poll(); cli0.setEstado(1);System.out.println("Salio un cliente c2.");}
                    if(cli0.getEntrada()>cli3.getTot()){ Caja3.poll(); cli0.setEstado(1);System.out.println("Salio un cliente c3.");}
                    if(cli0.getEntrada()>cli4.getTot()){ Caja4.poll(); cli0.setEstado(1);System.out.println("Salio un cliente c4.");}
                    }
                    catch(NullPointerException e){}
                    
                    nuevo[0]=Caja1.size();
                    nuevo[1]=Caja2.size();
                    nuevo[2]=Caja3.size();
                    nuevo[3]=Caja4.size();
                    menor = getMinValue(nuevo)+1;
                    System.out.println(nuevo[0]+","+nuevo[1]+","+nuevo[2]+","+nuevo[3]);
                    System.out.println(menor);
                    switch(menor){
                        case 1:
                                cli0.setCaja(menor);
                                Caja1.offer(cli0);
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cli0.getEntrada());
                                System.out.println("El tiemo de transac es: "+cli0.getTransac());
                                System.out.println("El cliente se ingreso a la caja: "+cli0.getCaja());
                                break;
                        case 2:
                                cli0.setCaja(menor);
                                Caja2.offer(cli0);
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cli0.getEntrada());
                                System.out.println("El tiemo de transac es: "+cli0.getTransac());
                                System.out.println("El cliente se ingreso a la caja: "+cli0.getCaja());
                                break;
                        case 3:
                                cli0.setCaja(menor);
                                Caja3.offer(cli0);
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cli0.getEntrada());
                                System.out.println("El tiemo de transac es: "+cli0.getTransac());
                                System.out.println("El cliente se ingreso a la caja: "+cli0.getCaja());
                                break;
                        case 4: 
                                cli0.setCaja(menor);
                                Caja4.offer(cli0);
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cli0.getEntrada());
                                System.out.println("El tiemo de transac es: "+cli0.getTransac());
                                System.out.println("El cliente se ingreso a la caja: "+cli0.getCaja());
                                break; 
                    }
                    
                   
                }
                    for(int r=0;r<10;r++){
                    if ((Caja1.size()+Caja2.size()+Caja3.size()+Caja4.size())==0)r=11;
                    Cliente cli1 = new Cliente();
                    Cliente cli2 = new Cliente();
                    Cliente cli3 = new Cliente();
                    Cliente cli4 = new Cliente();
                    int menor = 0;
                    if(!Caja1.isEmpty()) cli1 = Caja1.peek();
                    if(!Caja2.isEmpty()) cli2 = Caja2.peek();
                    if(!Caja3.isEmpty()) cli3 = Caja1.peek();
                    if(!Caja4.isEmpty()) cli4 = Caja2.peek();
                    nuevo[0] = cli1.getTot();
                    nuevo[1] = cli2.getTot();
                    nuevo[2] = cli3.getTot();
                    nuevo[3] = cli4.getTot();
                    int menos = getMinValue(nuevo);
                    try{
                    if(menos==0){ Caja1.poll(); cli1.setEstado(1);System.out.println("Salio un cliente c1.");}
                    if(menos==1){ Caja2.poll(); cli2.setEstado(1);System.out.println("Salio un cliente c2.");}
                    if(menos==2){ Caja3.poll(); cli3.setEstado(1);System.out.println("Salio un cliente c3.");}
                    if(menos==3){ Caja4.poll(); cli4.setEstado(1);System.out.println("Salio un cliente c4.");}
                    }catch(NullPointerException e){}
                    
                    }
                
           
        }
        }while(ingreso != 2);
        
        
    }
    
    public static void menu(){
        System.out.println();
        System.out.println("-------------- Menu Principal --------------");
        System.out.println();
        System.out.println(" 1. Ingresar Clientes.                      ");
        System.out.println(" 2. Salir.                                  ");
        System.out.println();
    }
    
        public static double obtenerNumero(String mensaje, boolean mostrar){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        
        System.out.print(mensaje);
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
            if (mostrar)
                System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
        }
      
      public static int calcTiemp(int ind){
          int ca=0;
          Cliente clien2 = ArrayClientes.get(ind);
          Cliente clien;
          int cajaa = clien2.getCaja();
          int result=0;
          for(int otro=ind-1;otro>0;otro--){
              clien = ArrayClientes.get(otro);
              ca = clien.getCaja();
              if(ca==cajaa) {
                  if(clien.getEstado()==0){
                  result += clien2.getTransac();
                  }
              }
          }
          return result;
      }  
        
      public static int getMinValue(int[] numbers){  
        int minValue = numbers[0]; 
        int ret=0;
        for(int i=1;i<numbers.length;i++){  
            if(numbers[i] < minValue){  
                minValue = numbers[i];
                ret = i;
            }  
        }  
        return ret;  
    }  
}
